package app.models;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;

import app.models.enums.StatusUsuario;
import app.models.enums.TipoPerfil;
import app.util.DateUtils;

/**
 * @author Douglas Fernandes
 * @since 24/11/2013
 */

@Entity
@Table(name = "USUARIO")
public class Usuario implements Pojo {

	private static final long serialVersionUID = -5774474359663708753L;
	
	
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "ID")
	private Long id;
	
	@Column(name = "USUARIO", columnDefinition = "varchar(20)")
	private String usuario;
	
	@Column(name = "SENHA", columnDefinition = "varchar(20)")
	private String senha;
	
	@NotNull(message = "O nome deve ser preenchido")
	@Column(name = "NOME", columnDefinition = "varchar(200)")
	private String nome;
	
	@Pattern(regexp = "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}", message = "A data de nascimento esta mal formada")
	//@NotNull(message = "A data de nascimento deve ser preenchida")
	@Column(name = "DATA_NASCIMENTO", columnDefinition = "date")
	private String dataNascimento;
	
	@NotNull(message = "O telefone principal deve ser preenchido")
	@Column(name = "TELEFONE1", columnDefinition = "varchar(30)")
	private String telefone1;
	
	@Column(name = "TELEFONE2", columnDefinition = "varchar(30)")
	private String telefone2;
	
	//@NotNull(message = "O CPF deve ser preenchido")
	@Column(name = "CPF", columnDefinition = "varchar(30)")
	private String cpf;
	
	//@NotNull(message = "O RG deve ser preenchido")
	@Column(name = "RG", columnDefinition = "varchar(11)")
	private String rg;
	
	@Column(name = "EMAIL", columnDefinition = "varchar(70)")
	private String email;
	
	@NotNull(message = "O perfil deve ser preenchido")
	@Column(name = "PERFIL", columnDefinition = "varchar(30)")
	@Enumerated(EnumType.STRING)
	private TipoPerfil perfil;
	
	//@NotNull(message = "O endereco deve ser preenchido")
	@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
	@JoinColumn(name = "ID_ENDERECO", referencedColumnName = "ID", insertable = true, updatable = true)
	private Endereco endereco;
	
	@Pattern(regexp = "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}", message = "A data de cadastro esta mal formada")
	@NotNull(message = "A data de cadastro deve ser preenchida")
	@Column(name = "DATA_CADASTRO", columnDefinition = "date")
	private String data = DateUtils.getDataAtual();
	
	@Pattern(regexp = "[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}", message = "A hora de cadastro esta mal formada")
	@NotNull(message = "A hora de cadastro deve ser preenchida")
	@Column(name = "HORA_CADASTRO", columnDefinition = "time")
	private String hora = DateUtils.getHoraCompletaAtual();
	
	@NotNull(message = "O usuario deve ter um status")
	@Column(name = "STATUS", columnDefinition = "varchar(10)")
	@Enumerated(EnumType.STRING)
	private StatusUsuario status = StatusUsuario.ATIVO;


	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getUsuario() {
		return usuario;
	}

	public void setUsuario(String usuario) {
		this.usuario = usuario;
	}

	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getDataNascimento() {
		return dataNascimento;
	}

	public void setDataNascimento(String dataNascimento) {
		this.dataNascimento = dataNascimento;
	}

	public String getTelefone1() {
		return telefone1;
	}

	public void setTelefone1(String telefone1) {
		this.telefone1 = telefone1;
	}

	public String getTelefone2() {
		return telefone2;
	}

	public void setTelefone2(String telefone2) {
		this.telefone2 = telefone2;
	}

	public String getCpf() {
		return cpf;
	}

	public void setCpf(String cpf) {
		this.cpf = cpf;
	}

	public String getRg() {
		return rg;
	}

	public void setRg(String rg) {
		this.rg = rg;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public TipoPerfil getPerfil() {
		return perfil;
	}

	public void setPerfil(TipoPerfil perfil) {
		this.perfil = perfil;
	}

	public Endereco getEndereco() {
		return endereco;
	}

	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}

	public String getData() {
		return data;
	}

	public void setData(String data) {
		this.data = data;
	}

	public String getHora() {
		return hora;
	}

	public void setHora(String hora) {
		this.hora = hora;
	}

	public StatusUsuario getStatus() {
		return status;
	}

	public void setStatus(StatusUsuario status) {
		this.status = status;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Usuario other = (Usuario) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

}
